# 查找 protoc 编译器
find_program(PROTOBUF_PROTOC protoc)
if(NOT PROTOBUF_PROTOC)
    message(FATAL_ERROR "protoc compiler not found. Please install protobuf.")
endif()

# 定义输入 .proto 文件
set(PROTO_INPUT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proto/my_message.proto")

# 定义生成输出文件的名称 (通常在构建目录中)
# CMAKE_CURRENT_BINARY_DIR 是当前源目录对应的构建目录
set(PROTO_OUTPUT_CC "${CMAKE_CURRENT_BINARY_DIR}/my_message.pb.cc")
set(PROTO_OUTPUT_H "${CMAKE_CURRENT_BINARY_DIR}/my_message.pb.h")

# 使用 add_custom_command 定义如何生成输出文件
add_custom_command(
    OUTPUT ${PROTO_OUTPUT_CC} ${PROTO_OUTPUT_H} # 指定生成的输出文件
    COMMAND ${PROTOBUF_PROTOC} # 要执行的命令 (protoc 编译器)
    ARGS
        --cpp_out=${CMAKE_CURRENT_BINARY_DIR} # protoc 参数：指定输出目录
        --proto_path=${CMAKE_CURRENT_SOURCE_DIR}/proto # protoc 参数：指定 .proto 文件查找路径
        ${PROTO_INPUT_FILE} # protoc 参数：指定输入文件
    DEPENDS
        ${PROTO_INPUT_FILE} # 显式依赖于输入 .proto 文件
        ${PROTOBUF_PROTOC} # 显式依赖于 protoc 工具本身 (可选，但推荐)
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} # 在构建目录中执行命令
    COMMENT "Generating C++ sources from ${PROTO_INPUT_FILE}" # 构建时显示信息
    VERBATIM # 确保参数正确传递
)

# 定义一个库 Target，并将生成的 .cc 文件添加到其源文件列表
# generated 文件通常需要使用绝对路径或者相对于当前源目录的相对路径（这里用绝对路径更保险）
add_library(protobuf_lib
    ${PROTO_OUTPUT_CC} # 将生成的 .cc 文件作为库的源文件
)

# 添加生成的头文件的包含目录，以便其他目标可以找到它
target_include_directories(protobuf_lib PUBLIC
    ${CMAKE_CURRENT_BINARY_DIR} # 包含生成头文件的目录
)